package _03字节流;

import java.io.*;
import java.util.*;

public class Exercise {
	// 1. 编写一个方法，实现文件的复制
	// (从输入流读入,写入到输出流)
//	copyFile("d:/1.jpg","d:/2.jpg");

	// 运行复制完后，查看下两个文件的大小是否完全一致

	// 方式1 读一个字节写一个字节
	// 方式2 读1024字节写1024字节
	// 找一个较大的文件进行测试，比较哪种效率更高.(比较运行花费时间)

	// 2. 编写一个方法，实现文件夹的复制
	// 需要使用File类和字节流
	// 需要使用递归
//	copyDirectory("d:/aaa","d:/bbb");

	// 3. 练习使用二进制文件查看工具查看文件的二进制信息

	// * 4. 编写一个方法,比较两个文件是否相同

	// * 5. 编写一个方法,比较2个目录内所有内容是否相同

	public static void main(String[] args) throws IOException {
		// 1. 编写一个方法，实现文件的复制
		try {
			copyFile("1.jpg", "2.jpg");
		} catch (IOException e) {
			// TODO: handle exception
			System.out.println("输入输出异常！" + e.getMessage());
		}

		// 2. 编写一个方法，实现文件夹的复制
		// 需要使用File类和字节流
		// 需要使用递归
//		copyDirectory("d:/aaa","d:/bbb");
		try {
			copyDirectory("d:/aaa", "d:/bbb");
		} catch (IOException e) {
			// TODO: handle exception
			System.out.println("文件夹找不到！" + e.getMessage());
		}

		// * 4. 编写一个方法,比较两个文件是否相同
		try {
			isSame("1.jpg", "2.jpg");
		} catch (IOException e) {
			// TODO: handle exception
			System.out.println("输入输出异常！" + e.getMessage());
		}
	}

	// * 4. 编写一个方法,比较两个文件是否相同
	private static void isSame(String str1, String str2) throws IOException {
		// TODO Auto-generated method stub

		InputStream is = new FileInputStream(str1);
		InputStream is1 = new FileInputStream(str2);
		int data;
		int data1;
		boolean issame = false;
		do {
			data = is.read();
			data1 = is1.read();
			if (data == data1) {
				issame = true;
			}

		} while (data != -1);
		if (issame) {
			System.out.println("两个文件相同！");
		} else {
			System.out.println("两个文件不相同！");
		}

		is.close();
		is1.close();

	}

	// 2. 编写一个方法，实现文件夹的复制
	// 需要使用File类和字节流
	// 需要使用递归
//		copyDirectory("d:/aaa","d:/bbb");
	private static void copy(String src, String dest) throws IOException {
		BufferedReader bufferedReader = new BufferedReader(new FileReader(src));
		BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(dest));
		String string = null;
		while ((string = bufferedReader.readLine()) != null) {
			bufferedWriter.write(string);
		}
		bufferedWriter.flush();
		bufferedReader.close();
		bufferedWriter.close();
	}

	// 2. 编写一个方法，实现文件夹的复制
	// 需要使用File类和字节流
	// 需要使用递归
//		copyDirectory("d:/aaa","d:/bbb");
	private static void copyDirectory(String src, String dest) throws IOException {
		File startFoler = new File(src);
		if (startFoler.isDirectory()) {
			File kFile = new File(dest + "/" + startFoler.getName());
			kFile.mkdirs();
			File[] files = startFoler.listFiles();
			for (File file : files) {
				copyDirectory(file.getAbsolutePath(), kFile.getAbsolutePath());
			}
		} else {
			copy(src, dest + "/" + startFoler.getName());
		}
	}

	// 1. 编写一个方法，实现文件的复制
	private static void copyFile(String str1, String str2) throws IOException {
		// TODO Auto-generated method stub
		InputStream is = new FileInputStream(str1);
		OutputStream os = new FileOutputStream(str2);
//		方式1 读一个字节写一个字节
		int data;
		do {
			data = is.read();
//			System.out.println(data);
			os.write(data);

		} while (data != -1);

//		方式2 读1024字节写1024字节
//		byte[] data = new byte[1024];
//		int len= 0;
//		do
//		{
//          从输入流读一个字节
//			len = is.read(data);
//		    if(len>0)
//		    {
		// 写入到输出流(写入读到的实际长度)
//		    	os.write(data,0,len);
//		    }
//		}while(len!=-1);

		is.close();
		os.close();

	}

}
